home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / basic / qbnws302.zip / LINEDIT.ZIP / KEYBOARD.BAS < prev    next >
BASIC Source File  |  1992-03-21  |  10KB  |  217 lines

  1. DEFINT A-Z
  2. '+==================================================================+
  3. '|                           KEYBOARD.BAS                           |
  4. '|                                                                  |
  5. '|  A set of input routines developed by Larry Stone and the SWOCC  |
  6. '|  students of Larry Stone, CS133B, Fall Term '91, SWOCC.          |
  7. '+------------------------------------------------------------------+
  8. '
  9. DECLARE FUNCTION InsertState% ()
  10. DECLARE FUNCTION KeyPressed% ()
  11. DECLARE FUNCTION Lower% (Value%)
  12. DECLARE FUNCTION Upper% (Value%)
  13.  
  14. CONST True = -1
  15. CONST False = 0
  16.  
  17. '+==================================================================+
  18. '|                            SUBPROGRAMS                           |
  19. '+------------------------------------------------------------------+
  20.  
  21. FUNCTION InsertState%
  22.  
  23.     '---- Insert is either On or Off and InsertState% is set to True or False
  24.     DEF SEG = False                         'Go to ROM segment
  25.     InsertState% = (PEEK(&H417) AND 128) = 128  '1000 0000
  26.     DEF SEG                                 'Back to BASIC DGROUP
  27.  
  28. END FUNCTION
  29.  
  30. '+==============================================================+
  31. '|                     KeyPressed% FUNCTION                     |
  32. '|                                                              |
  33. '|  Input:  Nothing                                             |
  34. '|  Return: The function returns an integer representing the    |
  35. '|          ASCII value of a keystroke.  If an extended key     |
  36. '|          value is returned from the keyboard buffer then the |
  37. '|          right byte (scan code) is returned as a negative    |
  38. '|          value.  If no keystroke is pending in the keyboard  |
  39. '|          buffer then zero is returned.                       |
  40. '+--------------------------------------------------------------+
  41. FUNCTION KeyPressed%
  42.  
  43.     Temp$ = INKEY$               'Get a keystroke from the keyboard buffer
  44.  
  45.     IF LEN(Temp$) THEN           'If we got a key from the buffer
  46.  
  47.         '---- Set value representing the right byte
  48.         AsciiValue = ASC(RIGHT$(Temp$, 1))
  49.  
  50.         '---- If extended key value then flag it so by changing its sign
  51.         IF LEN(Temp$) = 2 THEN AsciiValue = -AsciiValue
  52.     ELSE                         'No key value found in keyboard buffer
  53.  
  54.         AsciiValue = False       'So, set value to zero
  55.     END IF
  56.  
  57.     KeyPressed = AsciiValue      'Set the function to value derived
  58.  
  59. END FUNCTION
  60.  
  61. '+==============================================================+
  62. '|                        Lower% FUNCTION                       |
  63. '|                                                              |
  64. '|  Input:  An INTEGER value.                                   |
  65. '|  Return: The function returns the integer, unaltered, if     |
  66. '|          the value of the INTEGER is outside of the lower    |
  67. '|          case letter range.  If the INTEGER is between 65    |
  68. '|          and 90 (ASCII for 'A' through 'Z') then 32 is ORed  |
  69. '|          (added), resulting in a return value of 97 through  |
  70. '|          122 (ASCII for 'a' through 'z').                    |
  71. '+--------------------------------------------------------------+
  72. FUNCTION Lower% (Value%)
  73.     IF Value > 64 AND Value < 91 THEN Lower = Value OR 32 ELSE Lower = Value
  74. END FUNCTION
  75.  
  76. '+==============================================================+
  77. '|                      RingSound SUBPROGRAM                    |
  78. '|                                                              |
  79. '|  Input:    Nothing                                           |
  80. '|  Return:   Nothing                                           |
  81. '|  Purpose:  Produces a more pleasing sound than BEEP.         |
  82. '|            Does not use floating point library.              |
  83. '|                                                              |
  84. '+--------------------------------------------------------------+
  85. SUB RingSound
  86.  
  87.     OUT &H43, 182                   ' set up for sound
  88.     OUT &H42, &H33                  ' low part of sound
  89.     OUT &H42, 5                     ' high part of sound
  90.     N = INP(&H61)                   ' get byte value from port
  91.     N1 = N                          ' save value as N1
  92.     N = N OR 3                      ' set bits 0 and 1 to on
  93.     OUT &H61, N                     ' turn on speaker
  94.     GOSUB ShortDelay                ' delay 2 ticks
  95.     OUT &H42, &H33                  ' low part second tone
  96.     OUT &H42, 6                     ' high part second tone
  97.     GOSUB ShortDelay                ' delay 2 ticks
  98.     OUT &H61, N1                    ' turn speaker off
  99.     
  100.     DO: LOOP WHILE KeyPressed%      ' clear keyboard buffer
  101.  
  102.     EXIT SUB
  103.  
  104. ShortDelay:
  105.     DelayTicks% = 2
  106.     Tick% = False
  107.     TestTick% = False
  108.  
  109.     DEF SEG = False                 ' ROM BIOS
  110.     DO WHILE TestTick% < DelayTicks%
  111.         LastTick% = Tick%
  112.         Tick% = PEEK(&H46C)         ' get a tick from the clock.
  113.  
  114.         '   ---- Prevents endless loop when rolling past midnight.
  115.         IF LastTick% <> Tick% THEN TestTick% = TestTick% + 1
  116.     LOOP
  117.     DEF SEG                         ' back to BASIC DGROUP
  118. RETURN
  119.  
  120. END SUB
  121.  
  122. '+==============================================================+
  123. '|                     TurnCapsOn SUBPROGRAM                    |
  124. '|                                                              |
  125. '|  Input:    ToggleOn%     Boolean, False to toggle lock state |
  126. '|                          off, NOT False to toggle it on.     |
  127. '|  Return:   Nothing                                           |
  128. '|                                                              |
  129. '+--------------------------------------------------------------+
  130. SUB TurnCapsOn (ToggleOn%)
  131.  
  132.     DEF SEG = False                        'ROM segment
  133.     IF ToggleOn% THEN
  134.         POKE &H417, PEEK(&H417) OR 64      '0100 0000
  135.     ELSE
  136.         POKE &H417, PEEK(&H417) AND 191    '1011 1111
  137.     END IF
  138.     DEF SEG                                'Back to BASIC's DGROUP
  139.  
  140. END SUB
  141.  
  142. '+==============================================================+
  143. '|                    TurnInsertOn SUBPROGRAM                   |
  144. '|                                                              |
  145. '|  Input:    ToggleOn%     Boolean, False to toggle lock state |
  146. '|                          off, NOT False to toggle it on.     |
  147. '|  Return:   Nothing                                           |
  148. '|                                                              |
  149. '+--------------------------------------------------------------+
  150. SUB TurnInsertOn (ToggleOn%)
  151.  
  152.     DEF SEG = False                        'ROM segment
  153.     IF ToggleOn% THEN
  154.         POKE &H417, PEEK(&H417) OR 128     '1000 0000
  155.     ELSE
  156.         POKE &H417, PEEK(&H417) AND 127    '0111 1111
  157.     END IF
  158.     DEF SEG                                'Back to BASIC's DGROUP
  159.  
  160. END SUB
  161.  
  162. '+==============================================================+
  163. '|                      TurnNumOn SUBPROGRAM                    |
  164. '|                                                              |
  165. '|  Input:    ToggleOn%     Boolean, False to toggle lock state |
  166. '|                          off, NOT False to toggle it on.     |
  167. '|  Return:   Nothing                                           |
  168. '|                                                              |
  169. '+--------------------------------------------------------------+
  170. SUB TurnNumOn (ToggleOn%)
  171.  
  172.     DEF SEG = False                        'ROM segment
  173.     IF ToggleOn% THEN
  174.         POKE &H417, PEEK(&H417) OR 32      '0010 0000
  175.     ELSE
  176.         POKE &H417, PEEK(&H417) AND 223    '1101 1111
  177.     END IF
  178.     DEF SEG                                'Back to BASIC's DGROUP
  179.  
  180. END SUB
  181.  
  182. '+==============================================================+
  183. '|                    TurnScrollOn SUBPROGRAM                   |
  184. '|                                                              |
  185. '|  Input:    ToggleOn%     Boolean, False to toggle lock state |
  186. '|                          off, NOT False to toggle it on.     |
  187. '|  Return:   Nothing